abstract class InterfaceToAbstractClass
open class InterfaceToOpenClass
class InterfaceToFinalClass
annotation class InterfaceToAnnotationClass
object InterfaceToObject
enum class InterfaceToEnumClass
value class InterfaceToValueClass(val x: Int)
data class InterfaceToDataClass(val x: Int)

final class OpenClassToFinalClass(val x: Int)
annotation class OpenClassToAnnotationClass(val x: Int)
object OpenClassToObject { val x: Int = 42 }
enum class OpenClassToEnumClass(val x: Int)
value class OpenClassToValueClass(val x: Int)
data class OpenClassToDataClass(val x: Int)
interface OpenClassToInterface { val x: Int }

abstract class InterfaceToAbstractClass1
abstract class InterfaceToAbstractClass2
abstract class AbstractClass

//interface RemovedInterface {
//    fun abstractFun(): String
//    fun abstractFunWithDefaultImpl(): String = "RemovedInterface.abstractFunWithDefaultImpl"
//    val abstractVal: String
//    val abstractValWithDefaultImpl: String get() = "RemovedInterface.abstractValWithDefaultImpl"
//}
//
//abstract class RemovedAbstractClass {
//    abstract fun abstractFun(): String
//    open fun openFun(): String = "RemovedAbstractClass.openFun"
//    fun finalFun(): String = "RemovedAbstractClass.finalFun"
//    abstract val abstractVal: String
//    open val openVal: String get() = "RemovedAbstractClass.openVal"
//    val finalVal: String get() = "RemovedAbstractClass.finalVal"
//}
//
//open class RemovedOpenClass {
//    open fun openFun(): String = "RemovedOpenClass.openFun"
//    fun finalFun(): String = "RemovedOpenClass.finalFun"
//    open val openVal: String get() = "RemovedOpenClass.openVal"
//    val finalVal: String get() = "RemovedOpenClass.finalVal"
//}

abstract class AbstractClassWithChangedConstructorSignature(name: String, city: String) {
    val greeting = "Hello, $name from $city!"
}

open class OpenClassWithChangedConstructorSignature(name: String, city: String) {
    val greeting = "Hello, $name from $city!"
}

open class SuperSuperClass {
    open fun inheritsFrom() = "SuperSuperClass -> Any"
}
open class SuperClass : SuperSuperClass() {
    override fun inheritsFrom() = "SuperClass -> " + super.inheritsFrom()
}
class SuperSuperClassReplacedBySuperClass : /*SuperSuperClass()*/ SuperClass() {
    override fun inheritsFrom() = "SuperSuperClassReplacedBySuperClass -> " + super.inheritsFrom()
}
class SuperClassReplacedBySuperSuperClass : /*SuperClass()*/ SuperSuperClass() {
    override fun inheritsFrom() = "SuperClassReplacedBySuperSuperClass -> " + super.inheritsFrom()
}
